home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 60.zip
/
BS1 part 60
/
Highspeed pascal.adf
/
Demos
/
Print.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-12-31
|
9KB
|
296 lines
{----------------------------------------------------------------------}
{ HighSpeed Pascal Demo Program }
{ }
{ Copyright (C) 1990 by D-House I Aps, Denmark }
{ }
{ Programmed by Jacob V. Pedersen }
{ }
{ }
{ The program: Prints your Pascal programs (source-code). Any include }
{ files are also loaded and printed. Remarks can be dis- }
{ carded when printing. }
{----------------------------------------------------------------------}
Program Print;
Uses Printer,Dos;
Const
TopMargin = 2; { Top margin }
PrintLines = 59; { Lines to print per page }
BottomMargin = 11; { Bottom margin }
PageLines = 72; { Adds up to total lines per page }
MaxIncludeLevel = 7; { 0 is the same as IncLoad=False }
RemShow =False; { Show remarks? }
LinShow =False; { Show line numbers? }
IncLoad = True; { Load include files? }
Var
LineNum : Integer; { Line counter. Total }
PageCount : Byte; { Line counter. Page }
IncludeLevel : Byte; { Include-file level }
{ Main procedure to process the primary file, as well as any }
{ found include files. }
Procedure Process_File(Fil : PathStr; FirstFile : Boolean);
Var
InFil : Text; { Input file }
Ch , { Current character }
PrevCh : Char; { Previous character }
Buffer , { Buffer for output }
Data : String; { Line read from file }
LinePos : Byte; { Current position on line }
StrExp , { Currently in a strig expression? }
IgnoreStr , { Used in connection with StrExp }
In_Remark , { Currently in a remark? }
FirstLine, { First line in file? }
NormChr : Boolean; { Is there a character on the line? }
{ Stuffs characters into the output stream }
Procedure OutPut(C : Char);
Begin
If In_Remark and Not(RemShow) then Exit;
Buffer := Buffer + C;
If (C > #32) then
NormChr := True;
End;
{ Print a line to the output file }
Procedure PrintLine;
Var
X : Byte;
{ Returns true if no characters are present in the output stream }
Function EmptyLine : Boolean;
Var X : Byte;
Begin
For X := 1 to Length(Data) Do
If Data[x] <> #32 then
Begin
EmptyLine := False;
Exit;
End;
EmptyLine := True;
End;
{ Takes care of top and bottom margins }
Procedure MakeMargin(Lines : Byte);
Var
X : Byte;
Begin
For X := 1 to Lines Do
WriteLn(Lst);
End;
Begin { PrintLine }
If (NormChr or EmptyLine) and Not(FirstLine) then
Begin
If (PageCount = 0) then
MakeMargin(TopMargin)
Else
If (PageCount = PrintLines) then
Begin
MakeMargin(BottomMargin);
MakeMargin(TopMargin);
PageCount := 0;
End;
Inc(PageCount);
If LinShow then
Begin
Inc(LineNum);
Write(Lst,LineNum:5,',',IncludeLevel,': ');
End;
Writeln(Lst,Buffer);
End;
Buffer := '';
End; { PrintLine }
{ Provides the next character in the input stream }
Procedure NextCh;
Begin
PrevCh := Ch;
If LinePos = Length(Data) then
Begin
LinePos := 0;
PrintLine;
ReadLn(InFil,Data);
FirstLine := In_Remark and Not(RemShow);
NormChr := False;
Ch := #0;
End
Else
Begin
Inc(LinePos);
Ch := Data[LinePos];
End;
End; { NextCh }
{ Looks ahead in the input stream. Used to determine if a character }
{ is the start of a remark or a compiler directive }
Function LookAhead(Chars : Byte) : Char;
Begin
If LinePos+Chars <= Length(Data) then
LookAhead := Data[LinePos+Chars]
Else
LookAhead := #0;
End; { LookAhead }
{ Reads and processes any remarks found in the input stream }
Procedure Process_Remark;
Begin
In_Remark := True;
OutPut(Ch);
Case Ch Of
'{' : Repeat
NextCh; OutPut(Ch);
Until (Ch = '}');
'(' : Repeat
NextCh; OutPut(Ch);
Until (PrevCh = '*') and (Ch = ')');
End;
In_Remark := False;
End; { Process_Remark }
{ Reads and processes compiler directives. If IncLoad is True, then }
{ include files are processed by calling Process_File recursively }
Procedure Process_Directive;
Var
OldPos : Byte;
Navn : PathStr;
Stop : Char;
Begin
If IncLoad then
Begin
OldPos := LinePos;
If Ch = '{' then
Stop := '}' Else Stop := '*';
While PrevCh <> '$' Do
NextCh;
If (UpCase(Ch) = 'I') then
Begin
NextCh;
If (Ch = #32) then
Begin
Navn := '';
Repeat
NextCh;
If (Ch <> #32) and (Ch <> Stop) then
Navn := Navn + Ch;
Until (Ch = Stop);
If Ch = '*' then
NextCh;
Process_File(Navn,False);
Exit;
End;
End;
LinePos := OldPos;
OutPut(Data[LinePos]);
End { IncLoad }
Else
OutPut(Ch);
End; { Process_Directive }
Begin { Process_File }
If (IncludeLevel <= MaxIncludeLevel) Then { Check include level }
Begin
If (Pos('.',Fil) = 0) then
Fil := Fil + '.PAS'; { Check file extension }
Assign(InFil,Fil);
{$I-}
Reset(InFil); { Try to open the file }
{$I+}
If IOresult = 0 then { File exists. Begin processing }
Begin
If FirstFile then { If beginning of new printout }
Begin
LineNum := 0; { then reset some variables }
PageCount := 0;
IncludeLevel := 0;
End;
Inc(IncludeLevel);
FirstLine := True;
In_Remark := False;
StrExp := False;
IgnoreStr := False;
Ch := #0;
Data := '';
LinePos := 0;
Repeat
NextCh;
If Not(In_Remark) and (PrevCh = '''') then
Begin
If (Ch = '''') then
IgnoreStr := True
Else
Begin
If IgnoreStr then
IgnoreStr := False
Else
StrExp := Not(StrExp);
End;
End;
If StrExp then
OutPut(Ch)
Else
Case Ch Of
'{' : If (LookAhead(1) = '$') then
Process_Directive
else
Process_Remark;
'(' : If (LookAhead(1) = '*') then
Begin
If (LookAhead(2) = '$') then
Process_Directive
else
Process_Remark
End
Else
OutPut(Ch);
Else
OutPut(Ch);
End; { Case }
Until (Eof(InFil)) and (LinePos = Length(Data));
PrintLine;
Close(InFil);
Dec(IncludeLevel);
If (IncludeLevel = 0) then
Page(Lst);
End
Else
Writeln(#7,'Can''t process the file: ',Fil);
End
Else
Writeln('Include-level ',IncludeLevel,' is too deep.');
End; { Process_File }
Var
Name : String;
X : Byte;
BEGIN { Main }
Writeln('HighSpeed Pascal print program.');
Writeln;
If ParamCount = 0 then
Begin
Write('Enter name of program to print: ');
Readln(Name);
Process_File(Name,True);
End
Else
For X := 1 to ParamCount Do
Begin
Writeln('Printing: ',ParamStr(x));
Process_File(ParamStr(X),True);
End;
END.